package com.demo.java.OD51_100.OD90;

import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【字符串加密】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145657649
 */
public class OdMain {
    public static void main(String[] args) {
        try {
            // 创建 Scanner 对象用于获取用户输入
            Scanner s = new Scanner(System.in);

            // 读取第一行输入，转换为整数 n，表示接下来有 n 个字符串
            int n = Integer.parseInt(s.nextLine());

            // 如果输入的 n 小于 1 或者大于 1000，打印错误信息并退出
            if (n < 1 || n > 1000) {
                System.out.println("input error");
                return;
            }

            // 创建一个字符串数组，用于存储接下来的 n 个字符串
            String[] strs = new String[n];

            // 读取接下来的 n 个字符串，并存入数组
            for (int j = 0; j < n; ++j) {
                strs[j] = s.nextLine();
            }

            // 偏移量的计算规则，初始化前3个元素
            int[] array = {1, 2, 4};
            // 创建一个长度为 50 的 long 数组，用于存储计算出的偏移量
            long[] offsetsArray = new long[50];

            // 生成偏移量数组，前3个元素使用数组 array 中的数值，后续的元素按规则计算
            for (int j = 0; j < offsetsArray.length; ++j) {
                if (j < 3) {
                    // 前三个偏移量直接从 array 中获取
                    offsetsArray[j] = array[j];
                } else {
                    // 后续的偏移量是前三个偏移量的和
                    offsetsArray[j] = offsetsArray[j - 1] + offsetsArray[j - 2] + offsetsArray[j - 3];
                }
            }

            // 处理每个输入的字符串
            for (String str : strs) {
                // 将当前字符串转换为字符数组，以便逐个处理字符
                char[] myChars = str.toCharArray();

                // 对字符串中的每个字符进行加密处理
                for (int i = 0; i < myChars.length; ++i) {
                    // 获取当前字符
                    char c = myChars[i];

                    // 将字符的 ASCII 值减去 97，得到从 0 开始的字母索引，
                    // 加上偏移量并取模 26 保证字母循环，再加上 97 恢复为小写字母的 ASCII 值
                    myChars[i] = (char) ((c - 97 + offsetsArray[i]) % 26 + 97);
                }

                // 将加密后的字符数组转换为字符串并输出
                System.out.println(new String(myChars));
            }
        } catch (Exception e) {
            // 如果发生异常，打印异常信息并输出 "input error"
            e.printStackTrace();
            System.out.println("input error");
        }
    }
}
